import random
import time
import pyautogui
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

from Common.ver.slide import Slide
import base64


def slide_by_pyautogui(x, y, offset):
    """
    使用pyautogui 滑动
    :param x: 开始的x位置
    :param y: 开始y的位置
    :param offset: 互动横坐标偏移量
    :return:
    """
    xx = x + offset
    # 移动鼠标到指定位置
    pyautogui.moveTo(x, y, duration=0.1)
    # 按住鼠标
    pyautogui.mouseDown()
    y += random.randint(9, 19)
    print("第一次y的值" + str(y))
    # duration为持续时间，移动花费的时间由持续时间参数指定
    pyautogui.moveTo(x + int(offset * random.randint(15, 23) / 20), y, duration=0.28)
    print("第一次x移动的值" + str(x + int(offset * random.randint(15, 23) / 20)))
    y += random.randint(-9, 0)
    print("第二次y的值" + str(y))
    pyautogui.moveTo(x + int(offset * random.randint(17, 21) / 20), y,
                     duration=(random.randint(20, 31)) / 100)  # 鼠标拖动到坐标(1566,706)位置处
    print("第二次x移动的值" + str(x + int(offset * random.randint(17, 21) / 20)))
    y += random.randint(0, 8)
    print("第三次y的值" + str(y))
    pyautogui.moveTo(xx, y, duration=0.3)
    print("第三次x移动的值" + str(xx))
    # 松开鼠标
    pyautogui.mouseUp()


# 登陆，进入滑块验证码页面
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://passport.jd.com/new/login.aspx')
driver.find_element(By.XPATH, '//*[@id="content"]/div[2]/div[1]/div/div[3]/a').click()
driver.find_element(By.XPATH, '//*[@id="loginname"]').send_keys('ds123oi')
driver.find_element(By.XPATH, '//*[@id="nloginpwd"]').send_keys('dfsfads')
driver.find_element(By.XPATH, '//*[@id="loginsubmit"]').click()

while True:
    # 获取背景图片和模块图片的元素
    ele1 = driver.find_element(By.XPATH, '//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[1]/img')
    ele2 = driver.find_element(By.XPATH, '//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[2]/img')

    slide = Slide(driver)
    # 下载背景图片，链接就是base64编码，图片的一种编码
    base64_bg = ele1.get_attribute('src')
    # 截取图片的base64编码
    base64_bg = base64_bg[22:]

    # 下载模块图片，链接就是base64编码，图片的一种编码
    base64_block = ele2.get_attribute('src')
    print("截取前的base64："+base64_block)
    # 截取图片的base64编码
    base64_block = base64_block[22:]
    print("截取后的base64：" + str(base64_block))

    # 创建一个bg.jpg的图片，然后写入对应的图片编码，并关闭
    f = open('../../lib/verify/bg.jpg', mode='wb')
    f.write(base64.b64decode(base64_bg))
    f.close()

    # 创建一个block.jpg的图片，然后写入对应的图片编码，并关闭
    f = open('../../lib/verify/block.jpg', mode='wb')
    f.write(base64.b64decode(base64_block))
    f.close()

    # 找出图像中最佳匹配位置
    x = slide.FindPic('../../lib/verify/bg.jpg', '../../lib/verify/block.jpg')
    # 计算缩放，和电脑实际的分辨率一致, x的移动距离
    ll = ele1.size.get('width')
    print('渲染的width:' + str(ll))
    naturalWidth = ele1.get_attribute("naturalWidth")
    print('物理的width:' + str(naturalWidth))
    x = (int(x * ele1.size.get('width') / int(ele1.get_attribute("naturalWidth")))) * 1.25
    print("x的移动距离：" + str(x))
    print("模块图片的坐标" + str(ele2.location))

    # 滑块的x的中心位置，需要 + 20（可以微调）
    start_x = int(ele2.location.get('x')) * 1.25 + 20
    # 滑块的y的中心位置，需要 + 20（可以微调） ，再+ 145  （浏览器的顶栏和弹出调试模式的y距离）
    start_y = int(ele2.location.get('y')) * 1.25 + 165

    # 调用
    slide_by_pyautogui(start_x, start_y, x)
    print("x,y的起始坐标：" + str(start_x) + " " + str(start_y))

    time.sleep(2)
    try:
        driver.find_element(By.XPATH, '//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[2]/img').click()
    except:
        break
